<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //  作用域: 代码可使用的区域
        // 全局作用域:最外层作用域叫全局作用域(script包裹的全部范围或js整个文件)
        // 局部作用域： 又称函数作用域，通过函数来划分的作用域

        // 在全局作用域下声明的变量叫全局变量
        var num = 10;

        //每个函数都会生成一个独立的作用域，叫函数作用域/局部作用域
        function fun(){
            var str = "aaa";
          
            //局部函数
            function run(){
                console.log("这是run函数");
            }
            //函数内可以使用全局声明的变量和函数
            console.log(num); //undefind
            // 声明提升会将变量名提升到所在作用域(即当前函数)的最上方
            var num = 20;
            fun1(); //可以执行
        }
        fun()
        // 在全局作用域中无法使用函数内的变量和函数
        // console.log(str);没有这个变量
        // run(); //没有这个函数 
       
        // 在全局作用域下声明的函数叫全局函数
        function fun1(){
            console.log("这是函数1");
        }
        
        function run1() {
            // var num = 20;
            function run2() {
                // var num = 30;
                function run3() {
                    // var num = 40;
                    // 作用域链：使用一个属性或函数时，采用就近原则，
                    // 若是当前作用域没有则向上层作用域中查找,....,查找到全局作用域为止
                    console.log(num);
                }
                rum2()
            }
            run2()
        }
        run1()


    </script>
</body>
</html>